home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / nroff / main.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  20KB  |  974 lines

  1. #include "config.h"
  2.  
  3. /*
  4.  *    main.c - main for nroff word processor
  5.  *
  6.  *    similar to Unix(tm) nroff or RSX-11M RNO. adaptation of text processor
  7.  *    given in "Software Tools", Kernighan and Plauger.
  8.  *
  9.  *    adapted for atariST/TOS by Bill Rosenkranz 11/89
  10.  *    net:    rosenkra@hall.cray.com
  11.  *    CIS:    71460,17
  12.  *    GENIE:    W.ROSENKRANZ
  13.  *
  14.  *    original author:
  15.  *
  16.  *    Stephen L. Browning
  17.  *    5723 North Parker Avenue
  18.  *    Indianapolis, Indiana 46220
  19.  *
  20.  *    history:
  21.  *
  22.  *    - Originally written in BDS C;
  23.  *    - Adapted for standard C by W. N. Paul
  24.  *    - Heavily hacked up to conform to "real" nroff by Bill Rosenkranz
  25.  *    - Changed array index i from type long to type int (32000 is the
  26.  *      largest value anyhow) to prevent compiler warnings
  27.  *      by Wim 'Blue Baron' van Dorst (wsincc@tuerc3.urc.tue.nl)
  28.  *    - Changed termcap capabilities md/me, changed handling and
  29.  *       removed the unused standout references
  30.  *      by Wim 'Blue Baron' van Dorst (wsincc@tuerc3.urc.tue.nl)
  31.  */
  32.  
  33. #define NRO_MAIN            /* to define globals in nro.h */
  34.  
  35. #ifdef GEMDOS
  36. #include <sys\types.h>
  37. #include <sys\time.h>
  38. #else
  39. #include <sys/types.h>
  40. #include <time.h>
  41. #endif
  42.  
  43. #include <stdio.h>
  44. #include "nroff.h"
  45.  
  46.  
  47. main (argc, argv)
  48. int     argc;
  49. char   *argv[];
  50. {
  51.     register int    i;
  52.     int        swflg;
  53.     int        ifp = 0;
  54.     char           *ptmp;
  55. #ifndef GEMDOS
  56.     char           *pterm;
  57.     char        capability[100];
  58.     char           *pcap;
  59.     char           *ps;
  60. #endif
  61.  
  62.  
  63.  
  64.     /*
  65.      *   set up initial flags and file descriptors
  66.      */
  67.     swflg       = FALSE;
  68.     ignoring    = FALSE;
  69.     hold_screen = FALSE;
  70.     debugging   = FALSE;
  71.     stepping    = FALSE;
  72.     out_stream  = stdout;
  73.     err_stream  = stderr;
  74.     dbg_stream  = stderr;
  75.  
  76.  
  77.     /*
  78.      *   this is for tmp files, if ever needed. it SHOULD start
  79.      *   out without the trailing slash. if not in env, use default
  80.      */
  81.     if (ptmp = getenv ("TMPDIR"))
  82.         strcpy (tmpdir, ptmp);
  83.     else
  84.         strcpy (tmpdir, ".");
  85.  
  86.  
  87.     /*
  88.      *   handle terminal for \fB, \fI
  89.      */
  90. #ifdef GEMDOS
  91.     /*
  92.      *   atari/TOS is easy...
  93.      */
  94.     strcpy (s_bold, "\33p");
  95.     strcpy (e_bold, "\33q");
  96.     strcpy (s_italic, "\33p");
  97.     strcpy (e_italic, "\33q");
  98. #else
  99.     s_italic[0]   = '\0';
  100.     e_italic[0]   = '\0';
  101.     s_bold[0]     = '\0';
  102.     e_bold[0]     = '\0';
  103.     if ((pterm = getenv ("TERM"))
  104.     && (tgetent (termcap, pterm) == 1))
  105.     {
  106.         /*
  107.          *  termcap capabilities md/me for bold, us/ue for italic,
  108.          *  so/se if all else fails
  109.          */
  110.         pcap = capability;
  111.         if (ps = tgetstr ("so", &pcap))
  112.         {
  113. /* NOTE: the termcap on my sun has padding or something in it so i just
  114.    arbitarily remove it here. this is not right, but the worst that happens
  115.    is you have no standout. since minix uses standard ansi escape for so,
  116.    \E[7m, this should not be a problem. also i rarely use any non-ansi
  117.    terminals so this is also not a problem for me. the right thing to do
  118.    would be to use tputs() to remove the padding and write a new string
  119.    but i am lazy... */
  120.             while (*ps && *ps != 0x1B)    ps++;
  121.             strcpy (s_italic, ps);
  122.             strcpy (s_bold, ps);
  123.         }
  124.         if (ps = tgetstr ("se", &pcap))
  125.         {
  126.             while (*ps && *ps != 0x1B)    ps++;
  127.             strcpy (e_italic, ps);
  128.             strcpy (e_bold, ps);
  129.         }
  130.         /*
  131.          * Because the type faces are actually exclusive and
  132.          * the terminal capabilities are not the one has turn
  133.          * the other off before starting itself
  134.          */
  135.         /* End Italic */
  136.         if (ps = tgetstr ("ue", &pcap))
  137.         {
  138.             while (*ps && *ps != 0x1B)    ps++;
  139.             strcpy (e_italic, ps);
  140.         }
  141.         /* End Bold */
  142.         if (ps = tgetstr ("me", &pcap))
  143.         {
  144.             while (*ps && *ps != 0x1B)    ps++;
  145.             strcpy (e_bold, ps);
  146.         }
  147.         /* Start Italic */
  148.         if (ps = tgetstr ("us", &pcap))
  149.         {
  150.             while (*ps && *ps != 0x1B)    ps++;
  151.             strcpy (s_italic, e_bold);
  152.             strcat (s_italic, ps);
  153.         }
  154.         /* Start Bold */
  155.         if (ps = tgetstr ("md", &pcap))
  156.         {
  157.             while (*ps && *ps != 0x1B)    ps++;
  158.             strcpy (s_bold, e_italic);
  159.             strcat (s_bold, ps);
  160.         }
  161.     }
  162. #endif
  163.  
  164.  
  165.  
  166.     /*
  167.      *   initialize structures (defaults)
  168.      */
  169.     init ();
  170.  
  171.  
  172.     /*
  173.      *   parse cmdline flags
  174.      */
  175.     for (i = 1; i < argc; ++i)
  176.     {
  177.         if (*argv[i] == '-' || *argv[i] == '+')
  178.         {
  179.             if (pswitch (argv[i], argv[i+1], &swflg) == ERR)
  180.                 err_exit (-1);
  181.         }
  182.     }
  183.  
  184.  
  185.     /*
  186.      *   loop on files
  187.      */
  188.     for (i = 1; i < argc; ++i)
  189.     {
  190.         if (*argv[i] != '-' && *argv[i] != '+')
  191.         {
  192.             /*
  193.              *   open this file...
  194.              */
  195.             if ((sofile[0] = fopen (argv[i], "r")) == NULL_FPTR)
  196.             {
  197.                 fprintf (err_stream,
  198.                     "***%s: unable to open file %s\n",
  199.                     myname, argv[i]);
  200.                 err_exit (-1);
  201.             }
  202.             else
  203.             {
  204.                 /*
  205.                  *   do it for this file...
  206.                  */
  207.                 ifp = 1;
  208.                 profile ();
  209.                 fclose (sofile[0]);
  210.             }
  211.         }
  212.         else if (*argv[i] == '-' && *(argv[i]+1) == 0)
  213.         {
  214.             /*
  215.              *   - means read stdin (anywhere in file list)
  216.              */
  217.             sofile[0] = stdin;
  218.             ifp = 1;
  219.             profile ();
  220.         }
  221.  
  222.     }
  223.  
  224.  
  225.     /*
  226.      *   if no files, usage (should really use stdin...)
  227.      */
  228.     if ((ifp == 0 && swflg == FALSE) || argc <= 1)
  229.     {
  230.         usage ();
  231.  
  232.         err_exit (-1);
  233.     }
  234.  
  235.  
  236.     /*
  237.      *   normal exit. this will fflush/fclose streams...
  238.      */
  239.     err_exit (0);
  240. }
  241.  
  242.  
  243.  
  244.  
  245. /*------------------------------*/
  246. /*    usage            */
  247. /*------------------------------*/
  248. usage ()
  249. {
  250.     /*
  251.      *   note: -l may not work correctly
  252.      */
  253.     fprintf (stderr, "Usage:   %s [options] file [...]\n", myname);
  254.     fprintf (stderr, "Options: -a        no font changes\n");
  255.     fprintf (stderr, "         -b        backspace\n");
  256.     fprintf (stderr, "         -d        debug mode (file: nroff.dbg)\n");
  257. #ifdef GEMDOS
  258.     fprintf (stderr, "         -h        hold screen before desktop\n");
  259. #endif
  260.     fprintf (stderr, "         -l        output to printer\n");
  261.     fprintf (stderr, "         -m<name>  macro file (e.g. -man)\n");
  262.     fprintf (stderr, "         -o file   error log file (stderr is default)\n");
  263.     fprintf (stderr, "         -pl<n>    page length\n");
  264.     fprintf (stderr, "         -po<n>    page offset\n");
  265.     fprintf (stderr, "         -pn<n>    initial page number\n");
  266.     fprintf (stderr, "         -s        step through pages\n");
  267.     fprintf (stderr, "         -v        print version only\n");
  268.     fprintf (stderr, "         +<n>      first page to do\n");
  269.     fprintf (stderr, "         -<n>      last page to do\n");
  270.     fprintf (stderr, "         -         use stdin (in file list)\n");
  271. }
  272.  
  273.  
  274.  
  275.  
  276. /*------------------------------*/
  277. /*    init            */
  278. /*------------------------------*/
  279. init ()
  280. {
  281.  
  282. /*
  283.  *    initialize parameters for nro word processor
  284.  */
  285.  
  286.  
  287.     register int    i;
  288.     time_t        tval;
  289.     char           *ctim;
  290.  
  291.     tval       = time (0L);
  292.     dc.fill    = YES;
  293.     dc.dofnt   = YES;
  294.     dc.lsval   = 1;
  295.     dc.inval   = 0;
  296.     dc.rmval   = PAGEWIDTH - 1;
  297.     dc.llval   = PAGEWIDTH - 1;
  298.     dc.ltval   = PAGEWIDTH - 1;
  299.     dc.tival   = 0;
  300.     dc.ceval   = 0;
  301.     dc.ulval   = 0;
  302.     dc.cuval   = 0;
  303.     dc.juval   = YES;
  304.     dc.adjval  = ADJ_BOTH;
  305.     dc.boval   = 0;
  306.     dc.bsflg   = FALSE;
  307.     dc.prflg   = TRUE;
  308.     dc.sprdir  = 0;
  309.     dc.flevel  = 0;
  310.     dc.lastfnt = 1;
  311.     dc.thisfnt = 1;
  312.     dc.escon   = YES;
  313.     dc.pgchr   = '%';
  314.     dc.cmdchr  = '.';
  315.     dc.escchr  = '\\';
  316.     dc.nobrchr  = '\'';
  317.     for (i = 0; i < 26; ++i)
  318.         dc.nr[i] = 0;
  319.     for (i = 0; i < 26; ++i)
  320.         dc.nrauto[i] = 1;
  321.     for (i = 0; i < 26; ++i)
  322.         dc.nrfmt[i] = '1';
  323.  
  324.  
  325.     /*
  326.      *   initialize internal regs. first zero out...
  327.      */
  328.     for (i = 0; i < MAXREGS; i++)
  329.     {
  330.         rg[i].rname[0] = rg[i].rname[1] = rg[i].rname[2] = rg[i].rname[3] = '\0';
  331.         rg[i].rauto = 1;
  332.         rg[i].rval  = 0;
  333.         rg[i].rflag = RF_READ;
  334.         rg[i].rfmt  = '1';
  335.     }
  336.  
  337.  
  338.  
  339.     /*
  340.      *   this should be checked...
  341.      */
  342.     ctim = ctime (&tval);
  343.  
  344.  
  345.     /*
  346.      *   predefined regs. these are read/write:
  347.      */
  348.     i = 0;
  349.  
  350.     strcpy (rg[i].rname, "%");        /* current page */
  351.     rg[i].rauto = 1;
  352.     rg[i].rval  = 0;
  353.     rg[i].rflag = RF_READ | RF_WRITE;
  354.     rg[i].rfmt  = '1';
  355.     i++;
  356.     
  357.     strcpy (rg[i].rname, "ct");        /* character type */
  358.     rg[i].rauto = 1;
  359.     rg[i].rval  = 0;
  360.     rg[i].rflag = RF_READ | RF_WRITE;
  361.     rg[i].rfmt  = '1';
  362.     i++;
  363.     
  364.     strcpy (rg[i].rname, "dl");        /* width of last complete di */
  365.     rg[i].rauto = 1;
  366.     rg[i].rval  = 0;
  367.     rg[i].rflag = RF_READ | RF_WRITE;
  368.     rg[i].rfmt  = '1';
  369.     i++;
  370.     
  371.     strcpy (rg[i].rname, "dn");        /* height of last complete di */
  372.     rg[i].rauto = 1;
  373.     rg[i].rval  = 0;
  374.     rg[i].rflag = RF_READ | RF_WRITE;
  375.     rg[i].rfmt  = '1';
  376.     i++;
  377.     
  378.     strcpy (rg[i].rname, "dw");        /* day of week (1-7) */
  379.     rg[i].rval  = 0;
  380.     if      (!strncmp (&ctim[0], "Sun", 3))
  381.         rg[i].rval  = 1;
  382.     else if (!strncmp (&ctim[0], "Mon", 3))
  383.         rg[i].rval  = 2;
  384.     else if (!strncmp (&ctim[0], "Tue", 3))
  385.         rg[i].rval  = 3;
  386.     else if (!str